// http.js
import axios from 'axios'
// 创建 axios 实例
// 根据 process.env.NODE_ENV 区分状态，切换不同的 baseURL
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'production' ? `/apis` : './',
  headers: {
    get: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
      // 在开发中，若需要SSO(单点登录)或者其他功能的通用请求头，可以在这里设置
    },
    post: {
      'Content-Type': 'application/json;charset=utf-8'
      // 在开发中，若需要SSO(单点登录)或者其他功能的通用请求头，可以在这里设置
    }
  },
  // 跨域请求时是否需要使用凭证
  withCredentials: true,
  // 请求 30s 超时
  timeout: 30000,
  validateStatus: function() {
    // 使用async-await，处理reject情况较为繁琐，所以全部返回resolve，在业务代码中处理异常
    return true
  },
  // 在向服务器发送请求前，序列化请求数据
  transformRequest: [
    function(data) {
      data = JSON.stringify(data)
      return data
    }
  ],
  // 在传递给 then/catch 前，修改响应数据
  transformResponse: [
    function(data) {
      if (typeof data === 'string' && data.startsWith('{')) {
        data = JSON.parse(data)
      }
      return data
    }
  ]
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    return config
  },
  error => {
    // 错误抛到业务代码
    error.data = {}
    error.data.msg = 'Service error, pls contact system admin!'
    return Promise.resolve(error)
  }
)

const HTTP_STATUS = {
  400: '请求错误(400)',
  401: '未授权，请重新登录(401)',
  403: '拒绝访问(403)',
  404: '请求出错(404)',
  408: '请求超时(408)',
  500: '服务器内部错误(500)',
  501: '服务未实现(501)',
  502: '网络错误(502)',
  503: '服务不可用(503)',
  504: '网络超时(504)',
  505: 'HTTP版本不受支持(505)'
}

// 响应拦截器
service.interceptors.response.use(
  response => {
    const status = response.status
    let msg = ''
    if (status < 200 || status >= 300) {
      // 处理http错误，抛到业务代码
      msg = HTTP_STATUS(status)
      if (typeof response.data === 'string') {
        response.data = { msg }
      } else {
        response.data.msg = msg
      }
    }
    return response
  },
  error => {
    // 错误抛到业务代码
    error.data = {}
    error.data.msg = 'Network timeout or service error, pls check network connection or contact system admin!'
    return Promise.resolve(error)
  }
)

export default service
